package com.super8.super8newtv.api;


import android.text.TextUtils;

import com.lzy.okgo.model.HttpHeaders;

import com.super8.super8newtv.api.parser.IParserJson;
import com.super8.super8newtv.bean.ResponseBean;
import com.super8.super8newtv.utils.LogUtils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


/**
 * 业务描述:接口url 请求方法服务类
 *
 * @创 建 人: zhangl
 * @创建时间: 2020-07-07 17:03:23
 */
public class ApiService {
    private static volatile ApiService instance;
    public static final MediaType MEDIA_TYPE_PLAIN = MediaType.parse("text/plain;charset=utf-8");
    public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json;charset=utf-8");
    public static final MediaType MEDIA_TYPE_STREAM = MediaType.parse("application/octet-stream");
    /**
     * 业务描述:获取接口服务对象实例（单例模式）
     *
     * @param : 创 建 人: zhangl
     *          创建时间:2019-05-09 14:33:02
     * @return
     */
    public static ApiService getInstance() {
        if (instance == null) {
            synchronized (ApiService.class) {
                if (instance == null) {
                    instance = new ApiService();
                }
            }
        }
        return instance;
    }

    /**
     * 业务描述:接口请求_Get方法（请求参数HttpParams）
     *
     * @param : url 请求地址
     * @param : jsonStr 请求参数 （jsong格式）
     * @param : parserJson 接口返回数据 接收对象
     * @param : listener 接口请求监听事件
     *          创 建 人: zhangl
     *          创建时间:2019-05-09 14:41:35
     * @return
     */
    public <T> void get(String url,HashMap<String, String> paramsMap, final IParserJson<T> parserJson, final ApiContract.OnResponseListener<T> listener) {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();
        if(paramsMap!=null&&paramsMap.size()>0) {
            for (Map.Entry<String, String> arg : paramsMap.entrySet()) {
                builder.add(arg.getKey(), arg.getValue());
            }
        }
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), new JSONObject(refreshMap).toString());
        Request request = new Request
                .Builder()
                .post(builder.build())
                .url(url)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                LogUtils.e("apiError", "api接口:"+url+"调用报错" + e);
                final ApiError error = new ApiError(ApiError.ErrorCode.HTTP_STATUS_ERROR_NETWORK,"HTTP协议_请求网络错误,设备网络断开_444", e);
//                if (response != null) {
//                    switch (response.code()) {
//                        case 400:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_400");
//                            break;
//                        case 401:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_401");
//                            break;
//                        case 403:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_BAN,"HTTP协议_禁止请求_403");
//                            break;
//                        case 404:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求的内容不存在_404");
//                            break;
//                        case 500:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求服务器内部错误_500");
//                            break;
//                    }
//                }
                error.setCall(call);
//                error.setResponse(response);
                listener.onError(error);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String resultBody=response.body().string();
                LogUtils.i("ApiSuccess", resultBody);
                final ResponseBean<T> result;
                try {
                    result = parserJson.parse(resultBody);
                    listener.onSuccess(result);
                } catch (final ApiError apiError) {
                    apiError.printStackTrace();
                    listener.onError(apiError);
                }
            }
        });
    }


    /**
    * 业务描述:
    * @param :
    * @创 建 人: zhangl
    * @创建时间:2020-07-09 18:11:57
    * @return
    */
    /**
     * 业务描述:接口请求_Get方法（请求参数HttpParams）
     *
     * @param : url 请求地址
     * @param : token Authorization
     * @param : jsonStr 请求参数 （jsong格式）
     * @param : parserJson 接口返回数据 接收对象
     * @param : listener 接口请求监听事件
     *          创 建 人: zhangl
     *          创建时间:2020-07-09 18:11:57
     * @return
     */
    public <T> void get(String url,String token,HashMap<String, String> paramsMap, final IParserJson<T> parserJson, final ApiContract.OnResponseListener<T> listener) {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();
        if(paramsMap!=null&&paramsMap.size()>0) {
            for (Map.Entry<String, String> arg : paramsMap.entrySet()) {
                builder.add(arg.getKey(), arg.getValue());
            }
        }
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), new JSONObject(refreshMap).toString());
        Request request = new Request
                .Builder()
                .header("Authorization", "Bearer " + token)
                .post(builder.build())
                .url(url)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                LogUtils.e("apiError", "api接口:"+url+"调用报错" + e);
                final ApiError error = new ApiError(ApiError.ErrorCode.HTTP_STATUS_ERROR_NETWORK,"HTTP协议_请求网络错误,设备网络断开_444", e);
//                if (response != null) {
//                    switch (response.code()) {
//                        case 400:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_400");
//                            break;
//                        case 401:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_401");
//                            break;
//                        case 403:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_BAN,"HTTP协议_禁止请求_403");
//                            break;
//                        case 404:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求的内容不存在_404");
//                            break;
//                        case 500:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求服务器内部错误_500");
//                            break;
//                    }
//                }
                error.setCall(call);
//                error.setResponse(response);
                listener.onError(error);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String resultBody=response.body().string();
                LogUtils.i("ApiSuccess", resultBody);
                final ResponseBean<T> result;
                try {
                    result = parserJson.parse(resultBody);
                    listener.onSuccess(result);
                } catch (final ApiError apiError) {
                    apiError.printStackTrace();
                    listener.onError(apiError);
                }
            }
        });
    }

    public <T> void get(String url,String token, final IParserJson<T> parserJson, final ApiContract.OnResponseListener<T> listener) {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();

        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        Request request = new Request
                .Builder()
                .header("Authorization", "Bearer " + token)
                .url(url)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                LogUtils.e("apiError", "api接口:"+url+"调用报错" + e);
                final ApiError error = new ApiError(ApiError.ErrorCode.HTTP_STATUS_ERROR_NETWORK,"HTTP协议_请求网络错误,设备网络断开_444", e);
//                if (response != null) {
//                    switch (response.code()) {
//                        case 400:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_400");
//                            break;
//                        case 401:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_UNAUTHORIZED,"HTTP协议_未授权的请求_401");
//                            break;
//                        case 403:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_BAN,"HTTP协议_禁止请求_403");
//                            break;
//                        case 404:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求的内容不存在_404");
//                            break;
//                        case 500:
//                            error.setErrorCode(ApiError.ErrorCode.HTTP_STATUS_ERROR_REQUEST_CONTENT,"HTTP协议_请求服务器内部错误_500");
//                            break;
//                    }
//                }
                error.setCall(call);
//                error.setResponse(response);
                listener.onError(error);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String resultBody=response.body().string();
                LogUtils.i("ApiSuccess", resultBody);
                final ResponseBean<T> result;
                try {
                    result = parserJson.parse(resultBody);
                    listener.onSuccess(result);
                } catch (final ApiError apiError) {
                    apiError.printStackTrace();
                    listener.onError(apiError);
                }
            }
        });
    }

}
